package edu.asselvi.seguros.dao;

import java.sql.Connection; 
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import edu.asselvi.seguros.db.DbUtils;
import edu.asselvi.seguros.exception.ESegurosErros;
import edu.asselvi.seguros.exception.SegurosException;
import edu.asselvi.seguros.pojo.Item;

public class ItemDao extends DbUtils {
	
Connection conn = null;
	
	public ItemDao(Connection conn) {
		this.conn = conn;
	}
	
	
	public Item insert(Item item) throws SegurosException {

		String sql = "INSERT INTO ITENS (ID_ITEM, DESCRICAO, DOCUMENTO, ANO, VALOR, FRANQUIA, INDENIZACAO, FK_ID_TIPO_ITEM, FK_ID_MODELO, FK_ID_CONTRATO) VALUES (?,?,?,?,?,?,?,?,?,?)";
		PreparedStatement p = null;
		
		try {
			p = conn.prepareStatement(sql);
			item.setId_item(getNextId("SEQ_ITENS", conn));

			int cont = 1;

			p.setInt(cont++, item.getId_item());
			p.setString(cont++, item.getDescricao());
			p.setString(cont++, item.getDocumento());
			p.setInt(cont++, item.getAno());
			p.setDouble(cont++, item.getValor());
			p.setDouble(cont++, item.getFranquia());
			p.setDouble(cont++, item.getIndenizacao());
			p.setInt(cont++, item.getFk_id_tipo_item());
			p.setInt(cont++, item.getFk_id_modelo());
			p.setInt(cont++, item.getFk_id_contrato());
			
			p.executeUpdate();

		} catch (SQLException e) {
			throw new SegurosException(ESegurosErros.ERRO_INSERCAO);
			
		} finally {
			close(p);
		}
		
		return item;
	}


	public List<Item> listByContrato (int codContrato) throws SQLException, SegurosException {

		String sql = "SELECT * FROM ITENS WHERE FK_ID_CONTRATO = ?";

		List<Item> lista = null;
		PreparedStatement p = null;
		java.sql.ResultSet rs = null;

		try {
			lista = new ArrayList<Item>();
			p = conn.prepareStatement(sql);
			p.setInt(1, codContrato);
			
			rs = p.executeQuery();

			while (rs.next()) {

				Item item= new Item();
				
				item.setId_item(rs.getInt("ID_ITEM"));
				item.setDescricao(rs.getString("DESCRICAO"));
				item.setDocumento(rs.getString("DOCUMENTO"));
				item.setAno(rs.getInt("ANO"));
				item.setValor(rs.getDouble("VALOR"));
				item.setFranquia(rs.getDouble("FRANQUIA"));
				item.setIndenizacao(rs.getDouble("INDENIZACAO"));
				item.setFk_id_tipo_item(rs.getInt("FK_ID_TIPO_ITEM"));
				item.setFk_id_modelo(rs.getInt("FK_ID_MODELO"));
				item.setFk_id_contrato(rs.getInt("FK_ID_CONTRATO"));
				
				lista.add(item);
			}
			if (lista.isEmpty()){
				throw new SegurosException(ESegurosErros.ERRO_ZERO_REGISTROS);
			} 

		} finally {
			close(rs);
			close(p);
		}

		return lista;		
	}
	
	
	public double somaItens(int id_contrato) throws SegurosException {
			
		String sql = "SELECT SUM(VALOR) FROM ITENS WHERE FK_ID_CONTRATO = ?";
		PreparedStatement p = null;
		ResultSet rs = null;
		double valor = 0;
		try {
			p = conn.prepareStatement(sql);
			p.setInt(1, id_contrato);
			rs = p.executeQuery();
			
			if (rs.next()) {
				valor = rs.getDouble(1);
			}
			
		} catch (SQLException e) {
			throw new SegurosException(ESegurosErros.ERRO_SOMATORIO_ITENS);
		} finally {
			close(p);
			close(rs);
		}
		
		return valor;
	}


	
	
	public Item getItem(int id_item) throws SegurosException {

		String sql = "SELECT * FROM ITENS WHERE ID_ITEM = ?";
		Item item= new Item();
		PreparedStatement p = null;
		ResultSet rs = null;
		
		try {
			p = conn.prepareStatement(sql);
			p.setInt(1, id_item);
			rs = p.executeQuery();

			while (rs.next()) {

				item.setId_item(rs.getInt("ID_ITEM"));
				item.setDescricao(rs.getString("DESCRICAO"));
				item.setDocumento(rs.getString("DOCUMENTO"));
				item.setAno(rs.getInt("ANO"));
				item.setValor(rs.getDouble("VALOR"));
				item.setFranquia(rs.getDouble("FRANQUIA"));
				item.setIndenizacao(rs.getDouble("INDENIZACAO"));
				item.setFk_id_tipo_item(rs.getInt("FK_ID_TIPO_ITEM"));
				item.setFk_id_modelo(rs.getInt("FK_ID_MODELO"));
				item.setFk_id_contrato(rs.getInt("FK_ID_CONTRATO"));
				
			}
		} catch (SQLException e) {
			throw new SegurosException(ESegurosErros.ERRO_RECUPERAR_DADOS);
			
		} finally {
			close(p);
			close(rs);
		}
		return item;		
	}
}
